#include "startwindow.h"
#include "chatwindow.h"
#include "localchatserver.h"
#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
#include <QSystemSemaphore>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 使用系统信号量和共享内存实现单实例检查
    QSystemSemaphore semaphore("ChatOnlineSemaphore", 1, QSystemSemaphore::Create);
    semaphore.acquire();
    
    QSharedMemory sharedMemory("ChatOnlineSharedMemory");
    bool isRunning = false;
    
    if (!sharedMemory.create(1)) {
        // 如果共享内存创建失败，说明已有实例在运行
        isRunning = true;
    }
    
    semaphore.release();
    
    // 如果程序已经在运行，则允许继续运行（支持多实例）
    if (isRunning) {
        // 注意：这里我们允许继续运行，因为我们想要支持多实例
    }
    
    // 设置全局字体，更接近微信风格
    QFont font("Microsoft YaHei", 9);
    a.setFont(font);
    
    // 检查服务器是否已经运行
    bool serverRunning = LocalChatServer::isServerRunning();
    
    LocalChatServer *server = nullptr;
    if (!serverRunning) {
        // 如果服务器没有运行，则启动服务器
        server = new LocalChatServer();
        if (!server->startServer()) {
            QMessageBox::critical(nullptr, "错误", "无法启动服务器");
            return 1;
        }
    }
    
    // 循环显示启动窗口，允许用户创建多个聊天窗口
    while (true) {
        StartWindow *startWindow = new StartWindow();
        if (startWindow->exec() != QDialog::Accepted) {
            // 用户点击了退出按钮或关闭了窗口
            delete startWindow;
            break;
        }
        
        // 用户点击了进入聊天，创建聊天窗口
        QString username = startWindow->username();
        delete startWindow;
        
        // 显示聊天窗口
        ChatWindow *chatWindow = new ChatWindow(username);
        chatWindow->setAttribute(Qt::WA_DeleteOnClose); // 窗口关闭时自动删除
        chatWindow->show();
    }
    
    // 如果我们启动了服务器，则在程序退出时清理服务器
    if (server) {
        QObject::connect(&a, &QApplication::aboutToQuit, [server]() {
            server->stopServer();
            server->deleteLater();
        });
    }
    
    return a.exec();
}